#define _CRT_SECURE_NO_WARNINGS 1

#include <mutex>

class Singleton {
public:
    // 删除拷贝构造函数和赋值运算符
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

    static Singleton* getInstance() {
        if (instance == nullptr) {              // 第一次检查（避免不必要的锁）在加锁之前先检查实例是否已存在。如果实例已创建，则直接返回，避免每次调用 getInstance() 都进行加锁。
            std::lock_guard<std::mutex> lock(mutex);
            if (instance == nullptr) {          // 第二次检查（确保线程安全）当多个线程同时通过第一层检查时，只有第一个线程能进入锁内创建实例，后续线程在加锁后会发现实例已存在（被第一个线程创建），直接返回。
                instance = new Singleton();
            }
        }
        return instance;
    }

private:
    Singleton() {}                              // 私有构造函数
    ~Singleton() {}

    static Singleton* instance;                 // 单例指针
    static std::mutex mutex;                    // 互斥锁
};

// 静态成员初始化
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;



//C++11后的局部静态变量模式
class Singleton {
public:
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

    static Singleton& getInstance() {
        static Singleton instance;  // C++11 保证局部静态变量初始化是线程安全的
        return instance;
    }

private:
    Singleton() {}                  // 私有构造函数
    ~Singleton() {}
};